package com.asiainfo.iam.tool;


import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;

/**
 * 布隆过滤器
 * 用于对消息体进行快速判断是否一样，防止大量重复的消息进来，会进行数据库查询是否存在，对数据库造成压力
 */
@Component
public class BloomFilterUtil {
    private BloomFilter<String> messageFilter;//消息过滤器
    private static final long EXPECTED_INSERTIONS = 1000000;//预估插入数量一百万
    private static final double FPP = 0.001;//误报率0.01

    /**
     * 初始化
     */
    @PostConstruct
    public void init() {
        //创建一个过滤器，参数为 Funnel 对象、预期插入数量、误报率
        messageFilter = BloomFilter.create(
                Funnels.stringFunnel(StandardCharsets.UTF_8),
                EXPECTED_INSERTIONS,
                FPP
        );
    }

    /**
     *判断消息是否可能已处理（存在一定误判率）
     */
    public boolean mightContain(String contentHash) {
        return messageFilter.mightContain(contentHash);
    }
    /**
     * 添加消息到过滤器中
     */
    public void put(String contentHash) {
        messageFilter.put(contentHash);
    }
}
